package org.lql.algo.codecrush.week009.question.type.III;

import org.lql.algo.common.TreeNode;

/**
 * @author: liangqinglong
 * @date: 2025-08-20 17:02
 * @description: 101. 对称二叉树 <a href="https://leetcode.cn/problems/symmetric-tree/description/">...</a>
 **/
public class IsSymmetric {

	public boolean isSymmetric(TreeNode root) {
		// 增加空树判断，空树也认为是对称的，符合题目要求
		if (root == null) {
			return true;
		}
		return isMirror(root.left, root.right);
	}

	/**
	 * 判断两棵树是否为镜像对称
	 *
	 * @param node1 第一颗树的节点
	 * @param node2 第二颗树的节点
	 * @return 如果两棵树是镜像对称的，则返回true，否则返回false
	 */
	private boolean isMirror(TreeNode node1, TreeNode node2) {
		// 如果两个节点都为空，说明它们是镜像对称的
		if (node1 == null && node2 == null) {
			return true;
		}
		// 如果有一个节点为空，或者节点的值不相等，说明它们不是镜像对称的
		if (node1 == null || node2 == null || node1.val != node2.val) {
			return false;
		}
		// 递归判断左右子树是否镜像对称
		return isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
	}
}
